﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
using CADs;
using ModeloGaleriaNET;
using System.Data.Objects;

namespace GaleriaNET
{
    /// <summary>
    /// Lógica de interacción para ClienteFilterWindow.xaml
    /// </summary>
    public partial class ClienteFilterWindow : Window
    {
        private List<ClienteFilter> filters;
        private bool success;

        public ClienteFilterWindow()
        {
            InitializeComponent();
            filters = new List<ClienteFilter>();
        }

        public bool Success
        {
            get { return success; }
        }

        public List<ClienteFilter> Filters
        {
            get { return filters; }
        }

        private void cbUsuarioAlta_GotFocus(object sender, RoutedEventArgs e)
        {
            if (cbUsuarioAlta.ItemsSource == null)
            {
                cbUsuarioAlta.ItemsSource = new UsuarioCAD().GetUsuariosIdNombre();
                cbUsuarioAlta.DisplayMemberPath = "PseudonimoLocal";
                cbUsuarioAlta.SelectedValuePath = "Id";
                cbUsuarioAlta.SelectedIndex = -1;
            }
        }

        private void cbObras_GotFocus(object sender, RoutedEventArgs e)
        {
            List<Object> lista;
            Obra o;
            List<Obra> aux;

            if (cbObras.ItemsSource == null)
            {
                o = new Obra();
                aux = new List<Obra>();
                o.Nombre = "-- Sin obras --";
                o.Id = 0;
                aux.Add(o);
                lista = new List<object>();
                lista.AddRange(aux.Select(ob => new { ob.Id, ob.NombreAutor }));
                lista.AddRange(new ObraCAD().GetObrasIdNombreAutor());
                cbObras.ItemsSource = lista;
                cbObras.DisplayMemberPath = "NombreAutor";
                cbObras.SelectedValuePath = "Id";
                cbObras.SelectedIndex = -1;
            }
        }

        private void btCancelar_Click(object sender, RoutedEventArgs e)
        {
            success = false;
            Close();
        }

        private void btAceptar_Click(object sender, RoutedEventArgs e)
        {
            ClienteFilter filtro;

            #region DNI / CIF
            if (!string.IsNullOrWhiteSpace(tbDNICIF.Text))
            {
                filtro = new ClienteFilter(@"ToLower(it.dni_cif) like '%' + @dniCifInput + '%'");
                filtro.Parameters.Add(new ObjectParameter("dniCifInput", tbDNICIF.Text.ToLower()));
                filters.Add(filtro);
            }
            #endregion
            #region Nombre
            if (!string.IsNullOrWhiteSpace(tbNombre.Text))
            {
                filtro = new ClienteFilter(@"ToLower(it.nombre) like '%' + @nombreInput + '%'");
                filtro.Parameters.Add(new ObjectParameter("nombreInput", tbNombre.Text.ToLower()));
                filters.Add(filtro);
            }
            #endregion
            #region Apellido 1
            if (!string.IsNullOrWhiteSpace(tbApellido1.Text))
            {
                filtro = new ClienteFilter(@"ToLower(it.apellido1) like '%' + @ap1Input + '%'");
                filtro.Parameters.Add(new ObjectParameter("ap1Input", tbApellido1.Text.ToLower()));
                filters.Add(filtro);
            }
            #endregion
            #region Apellido 2
            if (!string.IsNullOrWhiteSpace(tbApellido2.Text))
            {
                filtro = new ClienteFilter(@"ToLower(it.apellido2) like '%' + @ap2Input + '%'");
                filtro.Parameters.Add(new ObjectParameter("ap2Input", tbApellido2.Text.ToLower()));
                filters.Add(filtro);
            }
            #endregion
            #region Dirección
            if (!string.IsNullOrWhiteSpace(tbDireccion.Text))
            {
                filtro = new ClienteFilter(@"ToLower(it.direccion) like '%' + @direccionInput + '%'");
                filtro.Parameters.Add(new ObjectParameter("direccionInput", tbDireccion.Text.ToLower()));
                filters.Add(filtro);
            }
            #endregion
            #region Población
            if (!string.IsNullOrWhiteSpace(tbPoblacion.Text))
            {
                filtro = new ClienteFilter(@"ToLower(it.poblacion) like '%' + @poblacionInput + '%'");
                filtro.Parameters.Add(new ObjectParameter("poblacionInput", tbPoblacion.Text.ToLower()));
                filters.Add(filtro);
            }
            #endregion
            #region Provincia
            if (!string.IsNullOrWhiteSpace(tbProvincia.Text))
            {
                filtro = new ClienteFilter(@"ToLower(it.provincia) like '%' + @provinicaInput + '%'");
                filtro.Parameters.Add(new ObjectParameter("provinciaInput", tbProvincia.Text.ToLower()));
                filters.Add(filtro);
            }
            #endregion
            #region Código postal
            if (!string.IsNullOrWhiteSpace(tbCPostal.Text))
            {
                filtro = new ClienteFilter(@"ToLower(it.codigoPostal) like '%' + @cPostalInput + '%'");
                filtro.Parameters.Add(new ObjectParameter("cPostalInput", tbCPostal.Text.ToLower()));
                filters.Add(filtro);
            }
            #endregion
            #region País
            if (cbPais.ItemsSource != null && cbPais.SelectedIndex != -1)
            {
                filtro = new ClienteFilter(@"EXISTS (select p.espanol from paises as p where p.id = @inputPais and p.id = it.pais)");
                filtro.Parameters.Add(new ObjectParameter("inputPais", Convert.ToInt32(cbPais.SelectedValue)));   
                filters.Add(filtro);
            }
            #endregion
            #region Teléfono
            if (!string.IsNullOrWhiteSpace(tbTelefono.Text))
            {
                filtro = new ClienteFilter(@"ToLower(it.telefono) like '%' + @telefonoInput + '%'");
                filtro.Parameters.Add(new ObjectParameter("telefonoInput", tbTelefono.Text.ToLower()));
                filters.Add(filtro);
            }
            #endregion
            #region Mail
            if (!string.IsNullOrWhiteSpace(tbMail.Text))
            {
                filtro = new ClienteFilter(@"ToLower(it.email) like '%' + @mailInput + '%'");
                filtro.Parameters.Add(new ObjectParameter("mailInput", tbMail.Text.ToLower()));
                filters.Add(filtro);
            }
            #endregion
            #region Empresa
            if (!string.IsNullOrWhiteSpace(tbNombreEmpresa.Text))
            {
                filtro = new ClienteFilter(@"ToLower(it.NombreEmpresa) like '%' + @empresaInput + '%'");
                filtro.Parameters.Add(new ObjectParameter("empresaInput", tbNombreEmpresa.Text.ToLower()));
                filters.Add(filtro);
            }
            #endregion
            #region Usuario de alta
            if (cbUsuarioAlta.ItemsSource != null && cbUsuarioAlta.SelectedIndex != -1)
            {
                filtro = new ClienteFilter("it.usuarioAlta = @inputAlta");
                filtro.Parameters.Add(new ObjectParameter("inputAlta",
                    Convert.ToInt32(cbUsuarioAlta.SelectedValue)));
                filters.Add(filtro);
            }
            #endregion
            #region Obras
            if (cbObras.ItemsSource != null && cbObras.SelectedIndex != -1)
            {
                if (cbObras.SelectedIndex == 0)
                {
                    filtro = new ClienteFilter(@"NOT EXISTS (select cpo.cliente from clientespropietariosobras as cpo where cpo.cliente = it.id and cpo.fechaFin IS null)");
                }
                else
                {
                    filtro = new ClienteFilter(@"EXISTS (select cpo.cliente from clientespropietariosobras as cpo where cpo.obra = @inputObra and cpo.cliente = it.id and cpo.fechaFin IS null)");
                    filtro.Parameters.Add(new ObjectParameter("inputObra",
                        Convert.ToInt32(cbObras.SelectedValue)));
                }
                filters.Add(filtro);
            }
            #endregion
            success = true;
            Close();
        }

        private void cbPais_GotFocus(object sender, RoutedEventArgs e)
        {
            if (cbPais.ItemsSource == null)
            {
                cbPais.ItemsSource = new PaisCAD().GetPaisIdSpanish();
                cbPais.SelectedValuePath = "Id";
                cbPais.DisplayMemberPath = "Espanol";
                cbPais.SelectedIndex = -1;
            }
        }
    }
}
